home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CLASSSRC.PAK / FILE.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  7KB  |  238 lines

  1. //----------------------------------------------------------------------------
  2. // Borland Class Library
  3. // Copyright (c) 1993, 1997 by Borland International, All rights
  4. //
  5. //$Revision:   5.9  $
  6. //
  7. // TFile class implementation.
  8. //----------------------------------------------------------------------------
  9. #include <classlib/pch.h>
  10. #include <classlib/file.h>
  11. #include <limits.h>
  12. #include <services/dir.h>              // for findfirst()
  13. #include <tchar.h>
  14.  
  15. #include <iostream.h>
  16.  
  17. int TFile::Open(const _TCHAR _BIDSFAR *name, uint16 access, uint16 permission)
  18. {
  19.   const unsigned shareFlags =
  20.   Compat | DenyNone | DenyRead | DenyWrite | DenyRdWr | NoInherit;
  21.   if (IsOpen())
  22.     return 0;
  23.   Handle = ::_tsopen(name, access & ~shareFlags, access & shareFlags, permission);
  24.   return IsOpen();
  25. }
  26.  
  27. int TFile::Close()
  28. {
  29.   if (IsOpen() && ::close(Handle) == 0) {
  30.     Handle = FileNull;
  31.     return 1;
  32.   }
  33.   else
  34.     return 0;
  35. }
  36.  
  37. long TFile::Length() const
  38. {
  39.   return ::filelength(Handle);
  40. }
  41.  
  42.  
  43. #if defined(BI_PLAT_DOS) || defined(BI_PLAT_WIN16) || (defined(BI_PLAT_WIN32) && defined(BI_COMP_BORLANDC))
  44.  
  45. int
  46. TFile::GetStatus(TFileStatus _BIDSFAR & status) const
  47. {
  48.   struct ftime ftime;
  49.   if (::getftime(Handle, &ftime) != 0)
  50.     return 0;
  51.   TDate fileDate(ftime.ft_day, ftime.ft_month, ftime.ft_year+1980);
  52.   status.createTime = TTime(fileDate,
  53.                            ftime.ft_hour,
  54.                            ftime.ft_min,
  55.                            ftime.ft_tsec*2);
  56.   status.modifyTime = status.createTime;
  57.   status.accessTime = status.createTime;
  58.   status.size = Length();
  59.   status.attribute = 0;
  60.   status.fullName[0] = '\0';
  61.   return 1;
  62. }
  63.  
  64. #elif defined(BI_PLAT_OS2)
  65.  
  66. TTime MakeTTime(FDATE fdate, FTIME ftime)
  67. {
  68.   TDate fileDate(fdate.day, fdate.month, fdate.year);
  69.   return TTime(fileDate, ftime.hours, ftime.minutes, ftime.twosecs*2);
  70. }
  71.  
  72. int TFile::GetStatus(TFileStatus _BIDSFAR& status) const
  73. {
  74.   FILESTATUS stat;
  75.   if (::DosQueryFileInfo(Handle, FIL_STANDARD, &stat, sizeof(stat)) != 0)
  76.     return 0;
  77.   status.createTime = MakeTTime(stat.fdateCreation, stat.ftimeCreation);
  78.   status.modifyTime = MakeTTime(stat.fdateLastWrite, stat.ftimeLastWrite);
  79.   status.accessTime = MakeTTime(stat.fdateLastAccess, stat.ftimeLastAccess);
  80.   status.size = stat.cbFile;
  81.   status.attribute = stat.attrFile;
  82.   status.fullName[0] = '\0';
  83.   return 1;
  84. }
  85.  
  86. #endif
  87.  
  88. #if defined(BI_PLAT_DOS) || defined(BI_PLAT_WIN16) || (defined(BI_PLAT_WIN32) && defined(BI_COMP_BORLANDC))
  89.  
  90. struct dos_ftime {
  91.   unsigned tsec : 5;
  92.   unsigned min  : 6;
  93.   unsigned hour : 5;
  94. };
  95.  
  96. struct dos_fdate {
  97.   unsigned day  : 5;
  98.   unsigned mon  : 4;
  99.   unsigned year : 7;
  100. };
  101.  
  102. int TFile::GetStatus(const _TCHAR _BIDSFAR *name, TFileStatus _BIDSFAR& status)
  103. {
  104.   if (::_tfullpath(status.fullName, name, sizeof status.fullName) == 0) {
  105.     status.fullName[0] = 0;
  106.     return 0;
  107.   }
  108.   ffblk blk;
  109.   const uint16 FA_ALL = FA_RDONLY | FA_HIDDEN | FA_SYSTEM |
  110.                       FA_LABEL | FA_DIREC | FA_ARCH;
  111.   if (_tfindfirst(status.fullName, &blk, FA_ALL) != 0)
  112.     return 0;
  113.  
  114.   union {
  115.     dos_ftime time;
  116.     dos_fdate date;
  117.     unsigned value;
  118.   };
  119.  
  120.   value = blk.ff_fdate;
  121.   TDate fileDate(date.day, date.mon, date.year+1980);
  122.   value = blk.ff_ftime;
  123.   status.createTime = TTime(fileDate,
  124.                             time.hour,
  125.                             time.min,
  126.                             time.tsec*2);
  127.  
  128.   status.modifyTime = status.createTime;
  129.   status.accessTime = status.createTime;
  130.   status.size = blk.ff_fsize;
  131.   status.attribute = uint8(blk.ff_attrib);
  132.   return 1;
  133. }
  134.  
  135. #elif defined(BI_PLAT_OS2)
  136.  
  137. int TFile::GetStatus(const _TCHAR _BIDSFAR *name, TFileStatus _BIDSFAR& status)
  138. {
  139.   if (::_tfullpath(status.fullName, name, sizeof(status.fullName)) == 0) {
  140.     status.fullName[0] = '\0';
  141.     return 0;
  142.   }
  143.   const uint16 FA_ALL = FA_RDONLY | FA_HIDDEN | FA_SYSTEM |
  144.                       FA_LABEL | FA_DIREC | FA_ARCH;
  145.   HDIR Handle;
  146.   FILEFINDBUF stat;
  147.   ULONG count;
  148.   if (::DosFindFirst(status.fullName,
  149.                     &Handle,
  150.                     FA_ALL,
  151.                     &stat,
  152.                     sizeof(stat),
  153.                     &count,
  154.                     0) != 0)
  155.   {
  156.     status.fullName[0] = '\0';
  157.     return 0;
  158.   }
  159.  
  160.   status.createTime = MakeTTime(stat.fdateCreation, stat.ftimeCreation);
  161.   status.modifyTime = MakeTTime(stat.fdateLastWrite, stat.ftimeLastWrite);
  162.   status.accessTime = MakeTTime(stat.fdateLastAccess, stat.ftimeLastAccess);
  163.   status.size = stat.cbFile;
  164.   status.attribute = stat.attrFile;
  165.   return 1;
  166. }
  167. #endif
  168.  
  169. #if defined(BI_PLAT_DOS) || defined(BI_PLAT_WIN16) || (defined(BI_PLAT_WIN32) && defined(BI_COMP_BORLANDC))
  170.  
  171. int TFile::SetStatus(const _TCHAR _BIDSFAR *name,
  172.                   const TFileStatus _BIDSFAR & status)
  173. {
  174.   int attr = ::_rtl_chmod(name, 0);
  175.   if (attr & TFile::RdOnly)
  176.     return 0;
  177.  
  178.   ftime fileTime;
  179.   fileTime.ft_tsec = status.createTime.Second()/2;
  180.   fileTime.ft_min = status.createTime.Minute();
  181.   fileTime.ft_hour = status.createTime.Hour();
  182.  
  183.   TDate date(status.createTime);
  184.   fileTime.ft_day = date.DayOfMonth();
  185.   fileTime.ft_month = date.Month();
  186.   fileTime.ft_year = date.Year()-1980;
  187.  
  188.   TFile file(name, ReadWrite | DenyWrite);
  189.   if (::setftime(file.GetHandle(), &fileTime) != 0)
  190.     return 0;
  191.   if (::chsize(file.GetHandle(), status.size) != 0)
  192.     return 0;
  193.   if (::_rtl_chmod(name, 1, status.attribute) == -1)
  194.     return 0;
  195.   return 1;
  196. }
  197.  
  198. #elif defined(BI_PLAT_OS2)
  199.  
  200. FDATE MakeFDATE(TTime time)
  201. {
  202.   FDATE fdate;
  203.   fdate.day = TDate(time).Day();
  204.   fdate.month = TDate(time).Month();
  205.   fdate.year = TDate(time).Year();
  206.   return fdate;
  207. }
  208.  
  209. FTIME MakeFTIME(TTime time)
  210. {
  211.   FTIME ftime;
  212.   ftime.hours = time.Hour();
  213.   ftime.minutes = time.Minute();
  214.   ftime.twosecs = time.Second()/2;
  215.   return ftime;
  216. }
  217.  
  218. int TFile::SetStatus(const _TCHAR _BIDSFAR *name,
  219.                   const TFileStatus _BIDSFAR & status)
  220. {
  221.   FILESTATUS stat;
  222.   stat.fdateCreation = MakeFDATE(status.createTime);
  223.   stat.ftimeCreation = MakeFTIME(status.createTime);
  224.   stat.fdateLastAccess = MakeFDATE(status.accessTime);
  225.   stat.ftimeLastAccess = MakeFTIME(status.accessTime);
  226.   stat.fdateLastWrite = MakeFDATE(status.modifyTime);
  227.   stat.ftimeLastWrite = MakeFTIME(status.modifyTime);
  228.   stat.cbFile = status.size;
  229.   stat.cbFileAlloc = status.size;
  230.   stat.attrFile = status.attribute;
  231.   TFile file(name, ReadWrite | DenyWrite);
  232.   return ::DosSetFileInfo(file.GetHandle(),
  233.                           FIL_STANDARD,
  234.                           &stat,
  235.                           sizeof stat);
  236. }
  237. #endif
  238.